home *** CD-ROM | disk | FTP | other *** search
/ Amiga News 95 / Amiga News 95.iso / dpat / dpat01 / mymemory / mymemory.asm < prev    next >
Encoding:
Assembly Source File  |  1992-07-21  |  10.1 KB  |  263 lines

  1. *------------------------------------------------------------------------*
  2. *                                MM                                      *
  3. *                         ( pour My Memory )                             *
  4. *                              V 1.2                                     *
  5. *------------------------------------------------------------------------*
  6. *                            Par AmiPhil                                 *
  7. *                                                                        *
  8. *                        Commencé le : 22.02.89                          *
  9. *                          Achevé le : 23.02.89                          *
  10. *                          Révisé le : 06.01.90 utilisation de RawDoFmt  *
  11. *                                               pour le formatage        *
  12. *------------------------------------------------------------------------*
  13. * Programme qui affiche en permanence la memoire disponible dans une     *
  14. * petite fenetre que l'on peut déplacer à volonté et fermer lorsque      *
  15. * on a plus besoin.                                                      *
  16. *                            Ameliorations                               *
  17. * Il est aussi possible de connaitre la position la plus basse atteinte  *
  18. * par la memoire disponible en appuyant sur le gadget de fermeture de la *
  19. * fenetre sans relacher le bouton sur celui-ci (ce qui aurait pour       *
  20. * conséquence la fermeture de la fenetre et la fin du programme).        *
  21. * Vous avez alors 2 secondes pour lire le minimum atteint par la memoire *
  22. * depuis la dernière lecture du minimum, car le mini est reinitialisé    *
  23. * aussitot apres.                                                        *
  24. * Puis encore 2 secondes pour lire la difference MemActuelle-MemMINI     *
  25. *                                                                        *
  26. * Le type de memoire, peut etre selectionné au clavier touches :         *
  27. * T(otal) ,F(ast) ou C(hip) apres avoir activé la fenetre                *
  28. * toutes les valeurs afichées concernent Uniquement le mode affiché:     *
  29. * soit T , F ou C, aussi bien pour les minis que pour les differences    *
  30. * entre le mini et la mem courante                                       *
  31. *                                                                        *
  32. * Cela vous permettra de savoir si vous n'avez pas, par exemple frisé la *
  33. * catastrophe lors d'une compilation avec peu de memoire ou bien savoir  *
  34. * Quelle quantité de memoire utilise tel ou tel programme                *
  35. * Les valeurs sont remises à jour tous les 20 ticks (NORMDEL)            *
  36. *                                                                        *
  37. * La fonction utilisée pour convertir le Long retourné par AvailMem()    *
  38. * en une chaine ASCII est maintenant RawDoFmt, j'ai enfin pigé comment   *
  39. * marche ce truc-la. C'est une fonction que j'ai rarement vue utilisée   *
  40. * et qui permet le formatage de donnes, comme le printf du C a partir de *
  41. * l'assembleur, donc assez interessante.                                 *
  42. *                                                                        *
  43. * et vivement que j'ai 2 Mégas,                                          *
  44. *------------------------------------------------------------------------*
  45.  
  46.  
  47.  
  48.  
  49.     INCLUDE "INCLUDE:INTUITION/INTUITION.I"
  50.     INCLUDE "INCLUDE:GRAPHICS/RASTPORT.I"
  51.     INCLUDE "INCLUDE:EXEC/MEMORY.I"
  52.  
  53.  
  54. XTRN    MACRO
  55.         XREF    _LVO\1
  56.         ENDM
  57.  
  58. CALL    MACRO
  59.         jsr _LVO\1(a6)
  60.         ENDM
  61.  
  62.  
  63.         XTRN    OpenLibrary
  64.         XTRN    GetMsg
  65.         XTRN    ReplyMsg
  66.         XTRN    AvailMem
  67.  
  68.         XTRN    Delay
  69.  
  70.         XTRN    OpenWindow
  71.         XTRN    CloseWindow
  72.         XTRN    CloseLibrary
  73.         XTRN    PrintIText
  74.         XTRN    RawDoFmt
  75.  
  76.         XREF    _AbsExecBase
  77.  
  78. NULL    EQU     0
  79. WIDTH   EQU     104
  80. MAXIMUM EQU     $FFFFFFF
  81. MINIDEL EQU     100
  82. NORMDEL EQU     20
  83.  
  84.  
  85.  
  86. main:
  87.         move.l  _AbsExecBase,a6       ;ouvrir le dos
  88.         clr.l   d0                    ;pour utiliser Delay()
  89.         lea     DosName(pc),a1
  90.         CALL    OpenLibrary
  91.         move.l  d0,DosBase
  92.  
  93.         clr.l   d0                    ;ouvrir intuition
  94.         lea     IntuiName(pc),a1      ;pour gestion fenetre
  95.         CALL    OpenLibrary           ;texte et messages
  96.         move.l  d0,IntuitionBase
  97.  
  98.         move.l  d0,a6                 ;ouvrir une fenetre
  99.         lea     MyNewWindow(pc),a0    ;definie + bas
  100.         CALL    OpenWindow
  101.         move.l  d0,MyWindow
  102.         move.l  #MAXIMUM,d4           ;mise au maximum du minimum  :-)
  103.         move.l  #MEMF_PUBLIC,d6
  104.  
  105. loop:                                 ;boucle principale
  106.         move.l  #NORMDEL,d5           ;1/2 seconde pour le Delay()
  107.         move.l  _AbsExecBase,a6       ;appel de la fonction avail
  108.         move.l  d6,d1
  109.         CALL    AvailMem              ;qui retourne la taille memoire dans d0
  110.         move.l  d0,Current
  111.         cmp.l   d0,d4                 ;comparer avec le minimum atteint jusqu'à présent
  112.         blt.s   go                    ;
  113.         move.l  d0,d4                 ;si inférieur réactualiser le mini (d4)
  114.  
  115. go:
  116.         cmp.l   #MAXIMUM,d0
  117.         beq     loop
  118.         bsr     convert               ;Convertir d0 en une string ASCII
  119.                                       ; et affichage
  120.  
  121. test:
  122.         move.l  _AbsExecBase,a6       ;ExecBase dans a6
  123.         move.l  MyWindow(pc),a0
  124.         move.l  wd_UserPort(a0),a0    ;UserPort de la window dans a0
  125.         CALL    GetMsg                ;appel GetMsg
  126.         tst.l   d0                    ;Y a t'il un message ?
  127.         beq     loop                  ;non ! alors on continue
  128.  
  129.         move.l  d0,d3                 ;oui ! alors sauvons le message dans d3
  130.         move.l  d0,a1                 ;et
  131.         CALL    ReplyMsg              ;renvoyons l'accusé réception
  132.         move.l  d3,a0                 ;puis verifions si
  133.         move.l  im_Class(a0),d0       ;c'est
  134.  
  135.         cmp.l   #CLOSEWINDOW,d0       ;CLOSEWINDOW
  136.         beq     closeall              ;et fermons tout
  137.         cmp.l   #VANILLAKEY,d0        ;est-ce une touche clavier ?
  138.         bne     DispMini
  139.         move.w  im_Code(a0),d0
  140.         and.b   #$df,d0               ;To UpperCase
  141. TestC:  cmp.b   #'C',d0
  142.         bne     TestF
  143.         move.l  #MEMF_CHIP,d6
  144.         bra     TEnd
  145. TestF:  cmp.b   #'F',d0
  146.         bne     TestT
  147.         move.l  #MEMF_FAST,d6
  148.         bra     TEnd
  149. TestT:  cmp.b   #'T',d0
  150.         bne     loop
  151.         move.l  #MEMF_PUBLIC,d6
  152. TEnd:   move.b  d0,StringText
  153.         move.l  #MAXIMUM,d4
  154.         bra     loop
  155.  
  156. DispMini:
  157.         move.l  d4,d0
  158.         move.l  #MINIDEL,d5           ;delay d'affichage 2 secondes
  159.         bsr convert
  160.         move.l  Current(pc),d0
  161.         sub.l   d4,d0
  162.         move.l  #MAXIMUM,d4           ;reinitialisation du mini
  163.         bra     go                    ;et on boucle
  164.  
  165.  
  166. *==================================================================
  167.  
  168. closeall:
  169.  
  170.         move.l  IntuitionBase(pc),a6      ;fermer fenetre
  171.         move.l  MyWindow(pc),a0
  172.         CALL    CloseWindow
  173.  
  174.         move.l  _AbsExecBase,a6
  175.  
  176.         move.l  IntuitionBase(pc),a1      ;fermer intuition
  177.         CALL    CloseLibrary
  178.  
  179.         move.l  DosBase(pc),a1            ;fermer dos
  180.         CALL    CloseLibrary
  181.  
  182.         rts
  183.  
  184.         CNOP    0,4
  185. *==================================================================
  186. convert:                              ;le nombre a afficher est dans d0
  187.  
  188.         move.l d0,ToDisplay
  189.  
  190.         move.l  _AbsExecBase,a6
  191.         lea     OutStr(pc),a0         ;ptr sur chaine de formatage
  192.         lea     ToDisplay(pc),a1      ;ptr sur valeur à formater
  193.         lea     PutChar(pc),a2        ;ptr sur fonction de transfert datas
  194.         lea     MemBuffer(pc),a3      ;ptr sur buffer pour la chaine ASCII
  195.  
  196.         CALL    RawDoFmt              ;Ah enfin j'ai reussi a faire marcher
  197. *                                     ;ca !!
  198.  
  199.         move.l  IntuitionBase(pc),a6  ;IntuitionBase ->a6
  200.         move.l  MyWindow(pc),a0
  201.         move.l  wd_RPort(a0),a0       ;RastPort de la window dans a0
  202.         lea     MemText(pc),a1        ;structure IntuiText dans a1
  203.         move.l  #30,d0                ;décalage horizontal dans d0
  204.         move.l  #1,d1                 ;décalage vertical dans d1
  205.         CALL    PrintIText            ;appel de PrintItext
  206.  
  207.         move.l  DosBase(pc),a6        ;Dosbase dans a6
  208.         move.l  d5,d1                 ;d5 = 20 (normal)ou 100(affichage du mini)
  209.         CALL    Delay                 ;on temporise avec delay
  210.  
  211.         rts
  212. *-----------------------------------------------------------------
  213. PutChar:                      ;fonction definie par l'utilisateur
  214.                               ;pour utiliser RawDoFmt. vu ca simplicité
  215.         move.b d0,(a3)+       ;je ne vois pas pourquoi elle n'a pas été
  216.         rts                   ;incluse dans la fonction, sutout que j'ai
  217. *                             ;tatonné un peu avant de trouver ca qui et
  218. *                             ;si simple......
  219.  
  220. *-----------------------------------------------------------------
  221.  
  222. MyWindow:        dc.l   0             ;Handle de la window
  223. IntuitionBase:   dc.l   0             ;place pour
  224. DosBase:         dc.l   0             ;les librairies
  225.  
  226. Current:         dc.l   0             ;mem courrante
  227. ToDisplay:       dc.l   0             ;chiffre à afficher
  228.  
  229. IntuiName:       dc.b   'intuition.library',0
  230. DosName:         dc.b   'dos.library',0
  231. WindowTitle:     dc.b   'AmiPhil90',0
  232. StringText       dc.b   'T:'          ;Buffer ASCII pour le Type of Mem
  233. MemBuffer:       dc.b   '       ',0   ;buffer ASCII pour MemText
  234. OutStr:          dc.b   '%7ld',0      ;chaine de formatage pour RawDoFmt
  235.  
  236.         CNOP    0,2
  237. *=================================================================
  238. MyNewWindow:                          ;definition fenetre
  239.     dc.w    (587-WIDTH),0
  240.     dc.w    WIDTH,10
  241.     dc.b    0,3
  242.     dc.l    CLOSEWINDOW+MOUSEBUTTONS+VANILLAKEY
  243.     dc.l    WINDOWCLOSE+WINDOWDRAG+SMART_REFRESH+NOCAREREFRESH
  244.     dc.l    NULL
  245.     dc.l    NULL
  246.     dc.l    WindowTitle
  247.     dc.l    NULL
  248.     dc.l    NULL
  249.     dc.w    0,0
  250.     dc.w    0,0
  251.     dc.w    WBENCHSCREEN
  252.  
  253.     CNOP 0,2
  254.  
  255. MemText:                              ;structure IntuiText
  256.     dc.b    1,0,RP_JAM2,0             ;pour PrintItext
  257.     dc.w    0,0
  258.     dc.l    NULL
  259.     dc.l    StringText
  260.     dc.l    NULL
  261.  
  262.     END
  263.